# -*- coding: utf-8 -*-
# @Time    : 2022/10/24 15:09
# @Author  : 限量老
from io import BytesIO

from django.http import HttpResponse
from django.shortcuts import render, redirect

from app01 import models
from app01.utils.form_总 import LoginForm
from app01.utils.code随机生成图片 import check_code



def login(request):
    '''登录'''

    if request.method == "GET":
        form = LoginForm()
        return render(request, 'login.html', {'form': form, })

    form = LoginForm(data=request.POST)
    if form.is_valid():
        print('pop前:', form.cleaned_data)

        '''这里取到form.cleaned_data的是表单里三个字段,验证码并没有写到数据库中,
        校验会失败,应该先把验证码pop出来校验'''
        user_input_code = form.cleaned_data.pop('code').upper()
        code_ = request.session.get('image_code', '')  # 或者为空,60秒超时
        if code_ != user_input_code:
            form.add_error('code', '验证码输入错误')
            return render(request, 'login.html', {'form': form})  # 如果不存在

        print('pop后:', form.cleaned_data)
        admin_object = models.Admin.objects.filter(**form.cleaned_data).first()  # 去数据库中根据条件筛选获取用户对象
        if not admin_object:
            form.add_error('password', '用户名或密码错误')
            return render(request, 'login.html', {'form': form})  # 如果不存在

        # 验证成功:
        # 网站生成随机字符串:给用户浏览器写到cookie中,再写入到session中
        request.session['info'] = {
            'id': admin_object.id, 'name': admin_object.username}
        # session会保存7天
        request.session.set_expiry(60 * 60 * 24 * 7)  # 7天.  一定要再设置超时,不然60秒后就得再登录

        return redirect('/admin/list')
    return render(request, 'login.html', {'form': form})


def image_code(request):
    """生成图片验证码"""
    # 调用 pillow函数,生成图片
    img, code_string = check_code()
    # print(code_string)

    # 写入到自己的cookie中,以便于后续获取验证码进行校验:
    request.session['image_code'] = code_string
    # 给Session设置60秒超时:
    request.session.set_expiry(60)

    stream = BytesIO()  # 把图片写在内存中,不写进文件
    img.save(stream, 'png')

    return HttpResponse(stream.getvalue())  # 返回内存中的图片


def logout(request):
    '''注销'''
    request.session.clear()

    return redirect('/login/')
